home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / x2ftp / msdos / mxcode / sbmixer / sb16mixr.pas < prev    next >
Pascal/Delphi Source File  |  1995-06-08  |  5KB  |  154 lines

  1. unit SB16Mixr;  {Only supports the CT1745 mixer used in the Sound Blaster 16}
  2.     interface {-------------------------------------------------------------}
  3.       procedure InitMixer(BaseIO: word); { $220, $240, $260, $280 }
  4.  
  5.       procedure ResetMixer;
  6.  
  7.       procedure SetMasterVolume(Left, Right: byte); {0..31}
  8.       procedure SetVoiceVolume(Left, Right: byte);  {0..31}
  9.       procedure SetFMVolume(Left, Right: byte);     {0..31}
  10.       procedure SetCDVolume(Left, Right: byte);     {0..31}
  11.       procedure SetLineVolume(Left, Right: byte);   {0..31}
  12.       procedure SetMicVolume(Volume: byte);         {0..31}
  13.       procedure SetPCSpeakerVolume(Volume: byte);   {0..3}
  14.  
  15.       const {Switches to use with SetInputMixer and SetOutputMixer}
  16.         Mic    = $01;                 {Use for Input, Output}
  17.         CD_R   = $02;  CD_L   = $04;  {Use for Input, Output}
  18.         Line_R = $08;  Line_L = $10;  {Use for Input, Output}
  19.         FM_R   = $20;  FM_L   = $40;  {Use for Input}
  20.       procedure SetOutputMixer(Switches: byte); {FM and Voice are always on}
  21.       procedure SetInputMixer(Left, Right: byte);
  22.  
  23.       procedure SetInputGain(Left, Right: byte);    {0..3 = (1, 2, 4, 8)}
  24.       procedure SetOutputGain(Left, Right: byte);   {0..3 = (1, 2, 4, 8)}
  25.  
  26.       const {Settings to use with SetMicAGC}
  27.         On  = true; Off = false;
  28.       procedure SetMicAGC(Setting: boolean);        {On, Off}
  29.  
  30.       procedure SetTreble(Left, Right: byte);       {0..15}
  31.       procedure SetBass(Left, Right: byte);         {0..15}
  32.  
  33.      {This will only work one level deep}
  34.       procedure SaveMixerState;
  35.       procedure RestoreMixerState;
  36.     implementation {--------------------------------------------------------}
  37.       var
  38.         SavedMixerState: array[$30..$47] of byte;
  39.         AddressPort: word;
  40.         DataPort:    word;
  41.       procedure WriteMixer(Reg: byte; Value: byte);
  42.         begin
  43.           Port[AddressPort] := Reg;
  44.           Port[DataPort]    := Value;
  45.         end;
  46.       function ReadMixer(Reg: byte): byte;
  47.         begin
  48.           Port[AddressPort] := Reg;
  49.           ReadMixer := Port[DataPort];
  50.         end;
  51.       procedure WriteReg(Reg: byte; Value: byte; Shift: byte);
  52.         var
  53.           Data: byte;
  54.         begin
  55.           Data := Value shl Shift;
  56.           WriteMixer(Reg, Data);
  57.         end;
  58.  
  59.       procedure InitMixer(BaseIO: word);
  60.         begin
  61.           AddressPort := BaseIO+4;  {2x4}
  62.           DataPort    := BaseIO+5;  {2x5}
  63.         end;
  64.  
  65.       procedure ResetMixer;
  66.         begin
  67.           WriteMixer($00, $FF);
  68.         end;
  69.  
  70.       procedure SetMasterVolume(Left, Right: byte);
  71.         begin
  72.           WriteReg($30, Left,  3);    {LLLLLxxx}
  73.           WriteReg($31, Right, 3);    {RRRRRxxx}
  74.         end;
  75.       procedure SetVoiceVolume(Left, Right: byte);
  76.         begin
  77.           WriteReg($32, Left,  3);    {LLLLLxxx}
  78.           WriteReg($33, Right, 3);    {RRRRRxxx}
  79.         end;
  80.       procedure SetFMVolume(Left, Right: byte);
  81.         begin
  82.           WriteReg($34, Left,  3);    {LLLLLxxx}
  83.           WriteReg($35, Right, 3);    {RRRRRxxx}
  84.         end;
  85.       procedure SetCDVolume(Left, Right: byte);
  86.         begin
  87.           WriteReg($36, Left,  3);    {LLLLLxxx}
  88.           WriteReg($37, Right, 3);    {RRRRRxxx}
  89.         end;
  90.       procedure SetLineVolume(Left, Right: byte);
  91.         begin
  92.           WriteReg($38, Left,  3);    {LLLLLxxx}
  93.           WriteReg($39, Right, 3);    {RRRRRxxx}
  94.         end;
  95.       procedure SetMicVolume(Volume: byte);
  96.         begin
  97.           WriteReg($3A, Volume, 3);   {VVVVVxxx}
  98.         end;
  99.       procedure SetPCSpeakerVolume(Volume: byte);
  100.         begin
  101.           WriteReg($3B, Volume, 6);   {VVxxxxxx}
  102.         end;
  103.  
  104.       procedure SetOutputMixer(Switches: byte);
  105.         begin
  106.           WriteReg($3C, Switches, 0); {xxxSSSSS}
  107.         end;
  108.       procedure SetInputMixer(Left, Right: byte);
  109.         begin
  110.           WriteReg($3D, Left,  0);  {xLLLLLLL}
  111.           WriteReg($3E, Right, 0);  {xRRRRRRR}
  112.         end;
  113.  
  114.       procedure SetInputGain(Left, Right: byte);
  115.         begin
  116.           WriteReg($3F, Left,  6);  {LLxxxxxx}
  117.           WriteReg($40, Right, 6);  {RRxxxxxx}
  118.         end;
  119.       procedure SetOutputGain(Left, Right: byte);
  120.         begin
  121.           WriteReg($41, Left,  6);  {LLxxxxxx}
  122.           WriteReg($42, Right, 6);  {RRxxxxxx}
  123.         end;
  124.  
  125.       procedure SetMicAGC(Setting: boolean);
  126.         begin
  127.           WriteReg($43, byte(not(Setting)), 0); {xxxxxxxS}
  128.         end;
  129.  
  130.       procedure SetTreble(Left, Right: byte);
  131.         begin
  132.           WriteReg($44, Left,  4);    {LLLLxxxx}
  133.           WriteReg($45, Right, 4);    {RRRRxxxx}
  134.         end;
  135.       procedure SetBass(Left, Right: byte);
  136.         begin
  137.           WriteReg($46, Left,  4);    {LLLLxxxx}
  138.           WriteReg($47, Right, 4);    {RRRRxxxx}
  139.         end;
  140.       procedure SaveMixerState;
  141.         var
  142.           i: byte;
  143.         begin
  144.           for i := $30 to $47 do
  145.             SavedMixerState[i] := ReadMixer(i);
  146.         end;
  147.       procedure RestoreMixerState;
  148.         var
  149.           i: byte;
  150.         begin
  151.           for i := $30 to $47 do
  152.             WriteMixer(i, SavedMixerState[i]);
  153.         end;
  154.     end. {------------------------------------------------------------------}